package com.smec.moblie.location;

import android.content.Context;

import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;

/**
 *
 * @author baidu
 *
 */
public class LocationService {
	private LocationClient client = null;
	private LocationClientOption mOption, DIYoption;
	private Object objLock = new Object();
	private boolean isNetWork = false;

	/***
	 *
	 * @param locationContext
	 */
	public LocationService(Context locationContext) {
		synchronized (objLock) {
			if (client == null) {
				client = new LocationClient(locationContext);
				client.setLocOption(getDefaultLocationClientOption());
			}
		}
	}

	/***
	 *
	 * @param listener
	 * @return
	 */

	public boolean registerListener(BDLocationListener listener) {
		boolean isSuccess = false;
		if (listener != null) {
			client.registerLocationListener(listener);
			isSuccess = true;
		}
		return isSuccess;
	}

	public void unregisterListener(BDLocationListener listener) {
		if (listener != null) {
			client.unRegisterLocationListener(listener);
		}
	}

	/***
	 *
	 * @param option
	 * @return isSuccessSetOption
	 */
	public boolean setLocationOption(LocationClientOption option) {
		boolean isSuccess = false;
		if (option != null) {
			if (client.isStarted())
				client.stop();
			DIYoption = option;
			client.setLocOption(option);
		}
		return isSuccess;
	}

	public LocationClientOption getOption() {
		return DIYoption;
	}

	/***
	 *
	 * @return DefaultLocationClientOption
	 */
	public LocationClientOption getDefaultLocationClientOption() {
		if (mOption == null) {
			mOption = new LocationClientOption();
			if (!isNetWork()) {
				mOption.setLocationMode(LocationMode.Device_Sensors);
			} else if (isNetWork()) {
				mOption.setLocationMode(LocationMode.Battery_Saving);
			} else {
				mOption.setLocationMode(LocationMode.Hight_Accuracy);// 可选，默认高精度，设置定位模式，高精度，低功耗，仅设备
			}
			mOption.setCoorType("gcj02");// 可选，默认gcj02，设置返回的定位结果坐标系，如果配合百度地图使用，建议设置为bd09ll;
			mOption.setScanSpan(0);// 可选，默认0，即仅定位一次，设置发起定位请求的间隔需要大于等于1000ms才是有效的
			mOption.setIsNeedAddress(false);// 可选，设置是否需要地址信息，默认不需要
			mOption.setNeedDeviceDirect(false);// 可选，设置是否需要设备方向结果
			mOption.setLocationNotify(true);// 可选，默认false，设置是否当gps有效时按照1S1次频率输出GPS结果
			mOption.setIgnoreKillProcess(false);// 可选，默认true，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认不杀死
			mOption.SetIgnoreCacheException(false);// 可选，默认false，设置是否收集CRASH信息，默认收集
			mOption.setProdName("smec");// 设置产品线名称。
			mOption.setOpenGps(true);// 设置开启GPS
		}
		return mOption;
	}

	public void start(boolean hasnetwork,Context context) {
		if (!ServiceUtil.isOPen(context)) {
			ServiceUtil.openGPS(context);
		}
		setNetWork(hasnetwork);
		synchronized (objLock) {
			if (client != null && !client.isStarted()) {
				client.start();
			}
		}
	}

	public void stop() {
		synchronized (objLock) {
			if (client != null && client.isStarted()) {
				client.stop();
			}
		}
	}

	public boolean isNetWork() {
		return isNetWork;
	}

	public void setNetWork(boolean isNetWork) {
		this.isNetWork = isNetWork;
	}

	public static String codeMsg(int code) {
		switch (code) {
		case 61:
			return "GPS定位结果，GPS定位成功。";
		case 62:
			return "无法获取有效定位依据，定位失败，请检查运营商网络或者wifi网络是否正常开启，尝试重新请求定位。";
		case 63:
			return "网络异常，没有成功向服务器发起请求，请确认当前测试手机网络是否通畅，尝试重新请求定位。";
		case 65:
			return "定位缓存的结果。";
		case 66:
			return "离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果。";
		case 67:
			return "离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果。";
		case 68:
			return "网络连接失败时，查找本地离线定位时对应的返回结果。";
		case 161:
			return "网络定位结果，网络定位定位成功。";
		case 162:
			return "请求串密文解析失败。";
		case 167:
			return "服务端定位失败，请您检查是否禁用获取位置信息权限，尝试重新请求定位。";
		case 502:
			return "key参数错误，请按照说明文档重新申请KEY。";
		case 505:
			return "key不存在或者非法，请按照说明文档重新申请KEY。";
		case 601:
			return "key服务被开发者自己禁用，请按照说明文档重新申请KEY。";
		case 602:
			return "key mcode不匹配，您的ak配置过程中安全码设置有问题，请确保：sha1正确，“;”分号是英文状态；且包名是您当前运行应用的包名，请按照说明文档重新申请KEY。";
		default:
			break;
		}
		return "";
	}

}
